#include <avr/io.h>
#include <avr/interrupt.h> 
#include "defines.h"
#include "timer.h"
#include "tx.h"

void TXAdd(uint8_t b);

volatile uint8_t TXbuf[TXSIZE] = {0};
volatile uint8_t TXbegin = 0;
volatile uint8_t TXend = 0;
volatile uint8_t TXlen = 0;

void TXAddByteBlocking(uint8_t b)
{
	while(TXspace() < 1)
	{
		;
	}
	TXAddByte(b);
}

void TXAddByte(uint8_t b)
{
	if(TXspace() < 1)
		return;

	TXAdd(b);
}

uint8_t TXspace(void)
{
	return TXSIZE - TXlen;
}

uint8_t TXfull(void)
{
	return TXlen;
}

void TXAdd(volatile uint8_t b)
{
	if(TXlen >= TXSIZE)//overflow
		return;
	
	cli();

	TXbuf[TXend] = b;
		
	TXend++;
	TXend %= TXSIZE;
	TXlen++;
	sei();
}

uint8_t TXRead(void)
{
	if(TXlen == 0)
		return 1;//no data
	
	cli();
	volatile uint8_t t;
		
	t = TXbuf[TXbegin];
	TXbegin++;
	TXbegin %= TXSIZE;
	TXlen--;
	
	sei();
	return t;
}
